package com.yydream;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class Apple {

    private int price;

    public int getPrice () {
        return price;
    }

    public void setPrice(int price) {
        this.price = price;
    }

    public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, InvocationTargetException, InstantiationException, IllegalAccessException {
//        正常写法
        Apple apple = new Apple();
        apple.setPrice(4);
        System.out.println("Apple Price: " + apple.getPrice());

//        反射写法
//        获取类的 Class 对象实例
        Class<?> aClass = Class.forName("com.yydream.Apple");
//        获取方法的 Method 对象
        Method setPrice = aClass.getMethod("setPrice", int.class);
//        根据 Class 对象实例获取 Constructor 对象
        Constructor<?> constructor = aClass.getConstructor();
//        使用 Constructor 对象的 newInstance 方法获取反射类对象
        Object appleObject = constructor.newInstance();
//        利用 invoke 方法调用方法
        setPrice.invoke(appleObject, 24);
//        获取方法的 Method 对象
        Method getPrice = aClass.getMethod("getPrice");
//        利用 invoke 方法调用方法
        Object invoke = getPrice.invoke(appleObject);
        System.out.println("反射 Apple Price: " + invoke);

    }
}
